import {
  REQUEST_HEADER
} from "../messages/uris.js";
import {
  toast,
  showToast
} from "./toast";

export default {
  /**
   * 打印响应信息
   *
   * printMessage(method,url,res)
   *
   * @param {string} method 请求方式
   * @param {string} url 请求地址
   * @param {object}} res 响应对象
   */
  printMessage: function (method, url, res) {
    console.log(`START====>> \n [${method}] [${url}] [${res.statusCode}]`);
    console.log(res);
    console.log(`END======>|`);
  },
  /**
   * 设置响应头
   * @param {object} header 请求头
   */
  loadToken: function (header) {
    let tokenValue = wx.getStorageSync("token");
    if (tokenValue) {
      // 如果有缓存的token, 设置token

      header = Object.assign({
        "X-Access-Token": tokenValue
      });

      // header = {
      //   "X-Access-Token": token,
      // };
    }
    return header;
  },

  /**
   * 基础请求方法
   * @param {*} method 请求方法
   * @param {string} url 请求地址
   * @param {object} data 携带数据
   * @param {object} header 请求头
   * @param {number}} timeout 超时时间, 单位毫秒
   * @param {function}} success 请求成功回调函数
   * @param {function} fial 请求失败回调函数
   * @param {function} completeFun 回调函数, 请求成功或失败都会调用
   * @param {function} that 页面对象
   */
  request: function (
    method,
    url,
    data,
    header,
    timeout,
    success,
    fail,
    completeFun, that
  ) {
    // 发送请求
    wx.request({
      url: url,
      data: data || {},
      header: header || {},
      method: method || "GET",
      timeout: timeout || 5000,
      success: (res) => {
        this.printMessage(method, url, res);
        switch (res.data.code) {
          case 200:
            // 如果响应有token, 存储
            try {
              if (res.data.result && res.data.result.token) {
                wx.setStorage({
                  key: "token",
                  data: res.data.result.token,
                });
              }
            } catch (error) {
              console.log(error);
            }

            // 调用自定义函数
            if (typeof success == "function") {
              // 调用成功
              success(res);
            }
            break;
          case 403:
            toast("登陆");
          case 300:
            wx.showModal({
              title: "未注册",
              content: "您还没有注册袋鼠代拿，是否前往注册",
              success(res) {
                if (res.confirm) {
                  wx.redirectTo({
                    url: "../regist/regist",
                  });
                }
              },
            });
          case 400:
          case 401:

          case 404:
          default:
            // 调用失败
            // toast(res.data.message);
            console.log("[请求失败]" + "[" + res.data.code + "]" + url);
            if (that) {
              showToast(that, res.data.code, res.data.message)
            }
            if (typeof fail == "function") {
              fail(res);
            }
            break;
        }
      },
      fail: (res) => {
        // toast("请求错误");
        if (that) {
          console.log(`==>`);
          console.log(res);
          showToast(that, '', '网络未连接, 请检查网络')
        }
        if (typeof fail == "function") {
          fail(res);
        }
      },
      complete: (res) => {
        if (typeof completeFun == "function") {
          completeFun(res);
        }
      },
    });
  },

  /**
   * GET请求方法
   * @param {string} url 请求地址
   * @param {object} data 请求数据
   * @param {function}} success 请求成功回调函数
   * @param {function} fial 请求失败回调函数
   * @param {function} complete 回调函数, 请求成功或失败都会调用
   * @param {function} that 页面对象
   */
  get: function (url, data, success, fial, complete, that) {
    let header = this.loadToken(header);
    // 封装, 解析data到uri
    if (Object.keys(data).length) {
      url += "?";
      for (let key in data) {
        let value = data[key];
        url += `${key}=${value}&`;
      }
      url = url.slice(0, url.length - 1);
    }

    this.request(
      "get",
      REQUEST_HEADER + url,
      data,
      header,
      5000,
      success,
      fial,
      complete, that
    );
  },

  /**
   * POST请求方法
   * @param {string} url 请求地址
   * @param {object} data 携带数据
   * @param {function}} success 请求成功回调函数
   * @param {function} fial 请求失败回调函数
   * @param {function} complete 回调函数, 请求成功或失败都会调用
   * @param {function} that 页面对象
   */
  post: function (url, data, success, fial, complete, that) {
    let header = this.loadToken(header);
    this.request(
      "post",
      REQUEST_HEADER + url,
      data,
      header,
      5000,
      success,
      fial,
      complete, that
    );
  },

  /**
   * DELETE请求方法
   * @param {string} url 请求地址
   * @param {object} data 携带数据
   * @param {function}} success 请求成功回调函数
   * @param {function} fial 请求失败回调函数
   * @param {function} complete 回调函数, 请求成功或失败都会调用
   * @param {function} that 页面对象
   */
  delete: function (url, data, success, fial, complete, that) {
    let header = this.loadToken(header);
    if (Object.keys(data).length) {
      url += "?";
      for (let key in data) {
        let value = data[key];
        url += `${key}=${value}&`;
      }
      url = url.slice(0, url.length - 1);
    }
    this.request(
      "delete",
      REQUEST_HEADER + url,
      data,
      header,
      5000,
      success,
      fial,
      complete, that
    );
  },

  /**
   * PUT请求方法
   * @param {string} url 请求地址
   * @param {object} data 携带数据
   * @param {function}} success 请求成功回调函数
   * @param {function} fial 请求失败回调函数
   * @param {function} complete 回调函数, 请求成功或失败都会调用
   * @param {function} that 页面对象
   */
  put: function (url, data, success, fial, complete, that) {
    let header = this.loadToken(header);

    this.request(
      "put",
      REQUEST_HEADER + url,
      data,
      header,
      5000,
      success,
      fial,
      complete, that
    );
  },
};